public class A30 {
    public static void main(String[] args) {
        //创建对象
        Animal a = new Dog();
        //编译看左边,运行看右边
        a.eat();//狗吃骨头
        /*多态的弊端
        不能调用子类的特有功能
        a.lookHome();//错误
        原因:当调用成员方法的时候,编译看左边,运行看右边
        那么在编译的时候会先检查左边的父类中有没有这个方法,如果没有直接报错.
        解决方法:强制类型转换,变回子类类型就可以了,但是不能瞎转,如果转乘其他类的类型就会报错
        */
        Dog d = (Dog)a;
        d.lookHome();//狗看家
        /*
        Cat c = (Cat)a;
        c.catchMouse();//错误
        原因:因为a引用指向的是一个狗对象,所以强制类型转换为猫对象就会报错
        */
        Animal a1 = new Cat();
        if(a1 instanceof Cat c){
            c.catchMouse();//猫抓老鼠
        }else if(a1 instanceof Dog d1){
            d1.lookHome();
        }else{
            System.out.println("没有这个类型,无法转换");
        }
        /*
        上面是简写
        Animal a1 = new Cat();
        if(a1 instanceof Cat){
            Cat c = (Cat)a1;
            c.catchMouse();
        }else if(a1 instanceof Dog){
            Dog d1 = (Dog)a1;
            d1.lookHome();
        }else{
            System.out.println("没有这个类型,无法转换");
        }
        */


    }
}
class Animal{
    public void eat(){
        System.out.println("动物在吃东西");
    }
}
class Dog extends Animal{
    @Override
    public void eat(){
        System.out.println("狗吃骨头");
    }
    public void lookHome(){
        System.out.println("狗看家");
    }
}
class Cat extends Animal{
    @Override
    public void eat(){
        System.out.println("猫吃鱼");
    }
    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}